package cn._51doit.day04;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

import java.nio.charset.Charset;


/**
 * @create: 2021-10-19 22:03
 * @author: 今晚打脑斧
 * @program: BloomFilterTest
 * @Description:
 * 布隆过滤器
 * create() : 三个参数,参数一要判断的类型,参数二可存储的数据个数,参数三误差
 *
 * 原理就是将数据通过不同方法获得几个hash值,根据这几个hash值到数组中对应位置进,将数组的对应位置数据改为1(原先是0)
 *
 * 获得数据的时候,也是通过不同方法获得几个hash值,方法,肯定和put的时候一样,然后根据这几个hash值,去对应的数组中对比,看看是不是1,如果都是1,说明数据参照,只要有一个不是1.那就是不存在
 *
 * 最后总结一下就是,布隆过滤器不会存储数据,只是存储数据是否在这个过滤器里
 **/
public class BloomFilterTest {
    public static void main(String[] args) {
        //默认误差是3%
        BloomFilter<Integer> integerBloomFilter = BloomFilter.create(Funnels.integerFunnel(), 10000);
        BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 1000, 0.001);
        BloomFilter<Long> longBloomFilter = BloomFilter.create(Funnels.longFunnel(), 10000);
        BloomFilter<byte[]> bloomFilter1 = BloomFilter.create(Funnels.byteArrayFunnel(), 1000);

        /**
         * mightContain  判断数据1是否在里面纪录过
         */
        boolean b = integerBloomFilter.mightContain(1);

        /**
         * 将数据2put到过滤器里面
         */
        integerBloomFilter.put(2);
//        integerBloomFilter.put(3);
//        integerBloomFilter.put(4);
//        integerBloomFilter.put(6);
//        integerBloomFilter.put(2);
        integerBloomFilter.put(2);

        /**
         * approximateElementCount
         * 近似元素计数 , 也就是获得过滤器中的数据数量
         */
        long l = integerBloomFilter.approximateElementCount();
        System.out.println(l);
    }
}
